/**
 * 字符串String
 * String是常用的类
 * 定义：就是把一堆字符串起来，统一使用
 */
/*
* String 类又称为不可变字符序列
* String位于java.lang包中，Java程序默认导入java.lang包下的所有类
*java字符串就是Unicode字符序列
*java 没有内置字符串类型，而是在标准java类库中提供了一个预定义的类String
  ，每个用双引号括起来的字符串都是String类的实现
*  */

public class TestString {
    public static void main(String[] args) {
        String s0 = null;
        String s1 = " ";//空字符串
        String s2 = "java";
        String s3 = new String("java");
        System.out.println(s1.length());
        System.out.println(s2.length());
        System.out.println(s3.length());
       // System.out.println(s0.length()); 会报错


        System.out.println("============字符串相当的问题========");

        String g1 = "北京尚学堂";//5个字符
        String g2 = "北京尚学堂";
        String g3 = new String("北京尚学堂");

        System.out.println(g1==g2);//true
        System.out.println(g1==g3);//false  g3在堆（heep）建立新对象，连接常量池的value[]
        //g3的解释
        /* public String(String original) {
            this.value = original.value;
            this.hash = original.hash;
        }*/
        System.out.println(g1.equals(g3));//true   存储的地址是否相同  都是在常量池中
    }

}
/*
equals和==的区别
        ==操作比较的是两个变量的值是否相等，对于引用型变量表示的是两个变量在堆中存储的地址是否相同，即栈中的内容是否相同。
        equals操作表示的两个变量是否是对同一个对象的引用，即堆中的内容是否相同。

 ==是一个比较运算符，基本数据类型比较的是值，引用数据类型比较的是地址值。
（比较地址值即是指是否为同一个对象的引用）
equals()是一个方法，只能比较引用数据类型。重写前比较的是地址值，重写后比一般是比较对象的性。

java中的数据类型，可分为两类：

1.基本数据类型，也称原始数据类型。

byte,short,char,int,long,float,double,boolean，他们之间的比较，应用双等号（==）,比较的是他们的值。

2.复合数据类型。

当他们用（==）进行比较的时候，比较的是他们在内存中的存放地址，所以，除非是同一个new出来的对象，他们的比较后的结果为true，
否则比较后结果为false。
JAVA当中所有的类都是继承于Object这个基类的，在Object中的基类中定义了一个equals的方法，这个方法的初始行为是比较对象的内存地址。
但在一些类库当中这个方法被覆盖掉了，如String,Integer,Date在这些类当中equals有其自身的实现，而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较，在没有覆写equals方法的情况下，他们之间的比较还是基于他们在内存中的存放位置的地址值的，
因为Object的equals方法也是用双等号（==）进行比较的，所以比较后的结果跟双等号（==）的结果相同。
 */
